/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package agenda.dao;

import agenda.bean.Cliente;
import agenda.controle.ControleCidade;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

/**
 *
 * @author Xand
 */
public class ClienteDAO {
    private Connection conn;
    private PesquisaDAO daoPesquisa;

    public ClienteDAO() {
        conn = Conexao.getInstance();
        daoPesquisa = new PesquisaDAO();
    }

    public boolean insert(Cliente c) {
        String sql = "insert into cliente (id, nome, cpf, endereco, cidade, limitecredito) "
                   + " values (nextval('seq_cliente'), ?, ?, ?, ?, ?) returning id";
        try {
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, c.getNome());
            ps.setString(2, c.getCpf());
            ps.setString(3, c.getEndereco());
            ps.setInt(4, c.getCidade().getId());
            ps.setBigDecimal(5, c.getLimitecredito());
            ResultSet rs = ps.executeQuery();
            if (rs.next()) {
                c.setId(rs.getInt("id"));
                rs.close();
                return true;
            } else {
                return false;
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(null, "Erro: " + ex.getMessage());
        }
        return false;
    }

    public boolean update(Cliente c) {
        String sql = "update cliente set nome = ?, cpf = ?, endereco = ?, cidade = ?, limitecredito = ? where id = ?";
        try {
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, c.getNome());
            ps.setString(2, c.getCpf());
            ps.setString(3, c.getEndereco());
            ps.setInt(4, c.getCidade().getId());
            ps.setBigDecimal(5, c.getLimitecredito());
            ps.setObject(6, c.getId());
            if (ps.executeUpdate() > 0) {
                return true;
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(null, "Erro: " + ex.getMessage());
        }
        return false;
    }

    public boolean delete(Integer id) {
        String sql = "delete from cliente where id = ?";
        try {
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setObject(1, id);
            if (ps.executeUpdate() > 0) {
                return true;
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(null, "Erro: " + ex.getMessage());
        }
        return false;
    }

    public List<Cliente> select(String filtro) {
        if (filtro == null || filtro.trim().isEmpty()) {
            filtro = "1 = 1";
        }
        String sql = "select * from cliente where " + filtro;
        ControleCidade controleCidade = new ControleCidade();
        try {
            ResultSet rs = conn.createStatement().executeQuery(sql);
            List<Cliente> contatos = new ArrayList<Cliente>();
            while (rs.next()) {
                Cliente c = new Cliente();
                c.setId(rs.getInt("id"));
                c.setNome(rs.getString("nome"));
                c.setCpf(rs.getString("cpf"));
                c.setEndereco(rs.getString("endereco"));
                c.setCidade(controleCidade.carregaCidade(rs.getInt("cidade")));
                c.setLimitecredito(rs.getBigDecimal("limitecredito"));
                contatos.add(c);
            }
            rs.close();
            return contatos;
        } catch (SQLException ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(null, "Erro: " + ex.getMessage());
        }
        return null;
    }

    public String getSqlPesquisa() {
        String sql = "select c.id as \"ID\", "
                   + "       c.nome as \"Nome\", "
                   + "       c.cpf as \"CPF\", "
                   + "       c.endereco as \"Endereço\", "
                   + "       cid.nome as \"Cidade\", "
                   + "       c.limitecredito as \"Credito\" "
                   + "  from cliente c "
                   + "  left join cidade cid on c.cidade = cid.id "
                   + " where upper(c.nome || '%' || c.endereco) like upper(?) "
                   + " order by c.nome";
        return sql;
    }

}


















